//Object.defineProperty 只可以监听 指定对象的指定属性的 getter 和 setter

// 定义一个商品对象，包含价格和数量
let quantity = 2;
let product = {
  price: 10,
  quantity: quantity,
};
// 总价格
let total = 0;
// 计算总价格的匿名函数
let effect = () => {
  //基础运算
  total = product.price * product.quantity;
};

// 第一次打印
effect();
console.log(`总价格：${total}`); // 总价格：20

// 监听 product 的 quantity 的 setter
Object.defineProperty(product, 'quantity', {
  // 监听 product.quantity = xx 的行为，在触发该行为时重新执行 effect
  set(newVal) {
    // 注意：这里不可以是 product.quantity = newVal，因为这样会重复触发 set 行为
    quantity = newVal;
    // 重新触发 effect
    effect();
  },
  //取用
  // 监听 product.quantity，在触发该行为时，以 quantity 变量的值作为 product.quantity 的属性值
  get(val) {
    return quantity;
  },
});

